One of the most challenging problems in the field of computing today is how to allow a wide variety of software developers to compute effectively on large amounts of data.
Parallel processing is one technique that has been employed for increasing the efficiency of computing on large amounts of data. Traditionally, parallel processing refers to the concept of speeding-up the execution of a program by dividing the program into multiple fragments that can execute concurrently, each on its own processor. A program being executed across n processors might execute n times faster than it would using a single processor. The terms concurrently and parallel are used to refer to the situation where the period for executing two or more processes overlap in time, even if they start and stop at different times. It is possible to perform parallel processing by connecting multiple computers in a network and distributing portions of the program to different computers on the network.
However, many software application developers are not experienced with parallel processing. Therefore, it can be difficult for them to write an application that can take advantage of parallel processing. Moreover, it is often difficult to divide an application program in such a way that separate processors can execute different portions of a program without interfering with each other. There has been a great deal of research performed with respect to automatically discovering and exploiting parallelism in programs which were written to be sequential. The results of that prior research, however, have not been successful enough for most developers to efficiently take advantage of parallel processing in a cost effective manner.